//
// Created by Administrator on 2023/11/16.
//
#include <cstring>
#include "iostream"

using namespace std;

const int N = 1e5 + 10;

int h[N], e[N * 2], ne[N * 2];
int ans = N, n, idx=0;
bool visited[N];

//加边操作
int add(int a, int b) {
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}

//求的是以u为根结点的子树的节点个数
int dfs(int u) {
    visited[u] = true;

    //size是表示将u点去除后，剩下的子树中数量的最大值；              用来求ans的
    //sum表示以u为根的子树的点的多少，初值为1，因为已经有了u这个点；   用来进行dfs的
    int size = 0, sum = 1;

    // 看其孩子为根时，各自子树的结点数量。
    for (int i = h[u]; i != -1; i = ne[i]) {
        int j = e[i];
        if (!visited[j]) {
            int s = dfs(j);
            size = max(size, s);//找到最多节点个数的子树
            sum += s;//以u为节点的结点个数
        }
    }
    size = max(size, n - sum);//u结点一定有父节点，这是除了以u结点为根的子树数量时，剩余结点的数量。
    ans = min(size, ans);//每次求最小值
    return sum;
}

int main() {
    cin >> n;
    int a, b;

    memset(h, -1, sizeof h);

    for (int i = 0; i < n - 1; ++i) {

        cin >> a >> b;
        add(a, b);
        add(b, a);
    }

    dfs(1);
    cout << ans;

}